package com.ardrone.dao;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;

import com.ardrone.revue.Produit;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class DatabaseHelper extends SQLiteOpenHelper{
	/**
     * Le chemin vers la base de données de l'application dans le smartphone
     */
    private final static String DB_PATH = "/data/data/com.ardrone.revue/databases/";
    /**
     * Le nom de la base de données 
     */
    private final static String DB_NAME = "produits.sqlite";
    /**
     * Le version de la base de données 
     */
    private final static int DB_VERSION = 1;
    /**
     * L'objet base de donnée récupérée sur le smartphone
     */
    private SQLiteDatabase myDatabase;
    /**
     * Le contexte de l'application
     */
    private final Context myContext;
    
    private static DatabaseHelper databaseHelper;
    
    public static DatabaseHelper getInstance(Context context)
    {
    	if(databaseHelper==null)
    		databaseHelper=new DatabaseHelper(context);
    	return databaseHelper;
    }
 
		protected DatabaseHelper(Context context) {
			super(context, DB_NAME, null, DB_VERSION);
			this.myContext = context;
		}
		 /**
	     * Creates a empty database on the system and rewrites it with your own
	     * database.
	     * */
	    public void createDataBase() throws IOException {
	        boolean dbExist = checkDataBase();
	        if (dbExist) {
	            // do nothing - database already exist
	        } else {
	            // By calling this method and empty database will be created into
	            // the default system path
	            // of your application so we are gonna be able to overwrite that
	            // database with our database.
	            this.getReadableDatabase();
	            try {
	                copyDataBase();
	            } catch (IOException e) {
	                throw new Error("Error copying database");
	            }
	        }
	    }

	    /**
	     * Check if the database already exist to avoid re-copying the file each
	     * time you open the application.
	     * 
	     * @return true if it exists, false if it doesn't
	     */
	    private boolean checkDataBase() {
	        SQLiteDatabase checkDB = null;
	        try {
	            String myPath = DB_PATH + DB_NAME;
	            checkDB = SQLiteDatabase.openDatabase(myPath, null,
	                    SQLiteDatabase.OPEN_READWRITE);
	        } catch (SQLiteException e) {
	            // database does't exist yet.
	        }
	        if (checkDB != null) {
	            checkDB.close();
	        }
	        return checkDB != null ? true : false;
	    }

	    /**
	     * Copies your database from your local assets-folder to the just created
	     * empty database in the system folder, from where it can be accessed and
	     * handled. This is done by transfering bytestream.
	     * */
	    private void copyDataBase() throws IOException {
	        // Open your local db as the input stream
	        InputStream myInput = myContext.getAssets().open(DB_NAME);
	        // Path to the just created empty db
	        String outFileName = DB_PATH + DB_NAME;
	        // Open the empty db as the output stream
	        OutputStream myOutput = new FileOutputStream(outFileName);
	        // transfer bytes from the inputfile to the outputfile
	        byte[] buffer = new byte[1024];
	        int length;
	        while ((length = myInput.read(buffer)) > 0) {
	            myOutput.write(buffer, 0, length);
	        }
	        // Close the streams
	        myOutput.flush();
	        myOutput.close();
	        myInput.close();
	    }

	    public void openDataBase() throws SQLException {
	        // Open the database
	        String myPath = DB_PATH + DB_NAME;
	        myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
	      
	    }

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL("create table produits (_id integer primary key autoincrement, "
					+ "codebarre text not null, titre text not null, " 
					+ "description text not null" 
					+ ");");			
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Toast.makeText(myContext, "Mise � jour de la Base de donn�es version "+oldVersion+" vers "+newVersion, Toast.LENGTH_SHORT).show();
			db.execSQL("DROP TABLE IF EXISTS produits");
			onCreate(db);
		}


	
	public void Truncate(){
		myDatabase.execSQL("DELETE FROM produits");
	}
	
	public long insererUnProduit(String codeBarre, String titre, String description){
		ContentValues values = new ContentValues();
		values.put("codebarre", codeBarre);
		values.put("titre", titre);
		values.put("description", description);
		return myDatabase.insert("produits", null, values);
	}
	
	
	public boolean supprimerProduit(long id){
		return myDatabase.delete("produits", "_id="+id, null)>0;
	}
	
	public ArrayList<Produit> recupererLaListeDesProduits(){
	
		 Cursor localCursor = myDatabase.rawQuery("SELECT _id, codebarre, titre, description from produits", null);
	        
	        ArrayList<Produit> localArray = new ArrayList<Produit>();
	        while (localCursor.moveToNext()) {

	            int _id = localCursor.getInt(localCursor.getColumnIndex("_id"));
	            String codebarre = localCursor.getString(localCursor.getColumnIndex("codebarre"));
	            String titre = localCursor.getString(localCursor.getColumnIndex("titre"));
	            String description =localCursor.getString(localCursor.getColumnIndex("description"));
	            
	            localArray.add(new Produit(_id,titre,description,codebarre));
	        }
	        
	        if (localCursor != null)
	            localCursor.close();
	        return localArray;
	}
	
	public ArrayList<String> recupererTitreProduits(){
		/*return myDatabase.query("produits", new String[]{
				"_id",
				"codebarre",
				"titre",
				"description"}, null, null, null, null, null);*/
		
		 Cursor localCursor = myDatabase.rawQuery("SELECT titre from produits", null);
	        
	        ArrayList<String> localArray = new ArrayList<String>();
	        while (localCursor.moveToNext()) {

	            String titre = localCursor.getString(localCursor.getColumnIndex("titre"));
	           
	            localArray.add(titre);
	        }
	        
	        if (localCursor != null)
	            localCursor.close();
	        return localArray;
	}
}